home *** CD-ROM | disk | FTP | other *** search
/ Gardening with Wildlife in Mind / Gardening with Wildlife in Mind.iso / program files / Natural England / html / ENslider.js < prev    next >
Text File  |  2006-11-18  |  14KB  |  373 lines

  1. function slider (a_init, a_tpl) {
  2.  
  3.     this.f_setValue  = f_sliderSetValue;
  4.     this.f_getPos = f_sliderGetPos;
  5.     
  6.     // register in the global collection    
  7.     if (!window.A_SLIDERS)
  8.         window.A_SLIDERS = [];
  9.     this.n_id = window.A_SLIDERS.length;
  10.     window.A_SLIDERS[this.n_id] = this;
  11.  
  12.     // save config parameters in the slider object
  13.     var s_key;
  14.     if (a_tpl)
  15.         for (s_key in a_tpl)
  16.             this[s_key] = a_tpl[s_key];
  17.     for (s_key in a_init)
  18.         this[s_key] = a_init[s_key];
  19.  
  20.     var n_range=this.n_maxValue - this.n_minValue;
  21.     var ScrollIncrement = this.n_increment;
  22.     if(this.b_vertical)
  23.     {
  24.         if(ScrollIncrement>=n_range)
  25.         {
  26.             JumpIncrement=1;
  27.             this.n_sliderHeight = this.n_controlHeight/(n_range+1);
  28.             this.n_sliderHeight = this.n_sliderHeight < 15 ? 15 : this.n_sliderHeight;
  29.             this.n_pathLength = this.n_controlHeight - this.n_sliderHeight - 4;
  30.         }
  31.         else
  32.         {
  33.             JumpIncrement=ScrollIncrement;
  34.             this.n_sliderHeight = (this.n_controlHeight*JumpIncrement)/n_range;
  35.             this.n_sliderHeight = this.n_sliderHeight < 15 ? 15 : this.n_sliderHeight;
  36.             this.n_pathLength = this.n_controlHeight - this.n_sliderHeight - 4;
  37.         }
  38.     }
  39.     else
  40.     {
  41.         if(ScrollIncrement>=n_range)
  42.         {
  43.             JumpIncrement=1;
  44.             this.n_sliderWidth = this.n_controlWidth/(n_range+1);
  45.             this.n_sliderWidth = this.n_sliderWidth < 15 ? 15 : this.n_sliderWidth;
  46.             this.n_pathLength = this.n_controlWidth - this.n_sliderWidth - 4;
  47.         }
  48.         else
  49.         {
  50.             JumpIncrement=ScrollIncrement;
  51.             this.n_sliderWidth = (this.n_controlWidth*JumpIncrement)/n_range;
  52.             this.n_sliderWidth = this.n_sliderWidth < 15 ? 15 : this.n_sliderWidth;
  53.             this.n_pathLength = this.n_controlWidth - this.n_sliderWidth - 4;
  54.         }
  55.     }
  56.     this.n_pix2value = this.n_pathLength / n_range;
  57.  
  58.     if (this.n_value == null)
  59.         this.n_value = this.n_minValue;
  60.  
  61.     // generate the control's HTML
  62.     if(this.b_vertical)
  63.     {
  64.         document.write('<table cellpadding=0; cellspacing=0><tr><td><img src="uparrow.gif"/ name="uparrow" class="slider" onmousedown="return f_sliderJumpStep(this, sl' + this.n_id + 'slider, ' + this.n_id + ', ' + this.n_step + ')"></td></tr><tr><td><div class="slider" style="width:' + this.n_controlWidth + 'px; height:' + this.n_controlHeight + 'px; border:0; background-image:url(' + this.s_imgControl + ')" id="sl' + this.n_id + 'base" onmousedown="return f_sliderJumpInterval(this, sl' + this.n_id + 'slider, ' + this.n_id + ', JumpIncrement)" onmouseout="return f_sliderMouseOut(' + this.n_id + ')")>' +             
  65.         '<img src="' + this.s_imgSlider + '" class="slider" width="' + this.n_sliderWidth + '" height="' + this.n_sliderHeight + '" border="0" style="position:relative;left:' + this.n_pathLeft + 'px;top:' + this.n_pathTop + 'px;z-index:' + this.n_zIndex + ';cursor:hand;visibility:hidden;" name="sl' + this.n_id + 'slider" id="sl' + this.n_id + 'slider" onmousedown="return f_sliderMouseDown(' + this.n_id + ')"/></div></td></tr><tr><td><img src="downarrow.gif"/ name="downarrow" class="slider" onmousedown="return f_sliderJumpStep(this, sl' + this.n_id + 'slider, ' + this.n_id + ', ' + this.n_step + ')"></td></tr></table>')
  66.     }
  67.     else
  68.     {
  69.         document.write('<table cellpadding=0; cellspacing=0><tr><td><img src="' + n_leftarrow + '"/ name="leftarrow" class="slider" onmousedown="return f_sliderJumpStep(this, sl' + this.n_id + 'slider, ' + this.n_id + ', -' + this.n_step + ')"  onmouseup="return f_ReloadPage(' + this.n_id + ')"></td><td><div class="slider" style="width:' + this.n_controlWidth + 'px; height:' + this.n_controlHeight + 'px; border:0; background-image:url(' + this.s_imgControl + ')" id="sl' + this.n_id + 'base" onmousedown="return f_sliderJumpInterval(this, sl' + this.n_id + 'slider, ' + this.n_id + ', JumpIncrement)" onmouseup="return f_ReloadPage(' + this.n_id + ')" onmouseout="return f_sliderMouseOut(' + this.n_id + ')">' + '<img src="' + this.s_imgSlider + '" class="slider" width="' + this.n_sliderWidth + '" height="' + this.n_sliderHeight + '" border="0" style="position:relative;left:' + this.n_pathLeft + 'px;top:' + this.n_pathTop + 'px;z-index:' + this.n_zIndex + ';cursor:hand;visibility:hidden;" name="sl' + this.n_id + 'slider" id="sl' + this.n_id + 'slider" onmousedown="return f_sliderMouseDown(' + this.n_id + ')"  onmouseup="return f_ReloadPage(' + this.n_id + ')"/></div></td><td><img src="' + n_rightarrow + '"/ name="rightarrow" class="slider" onmousedown="return f_sliderJumpStep(this, sl' + this.n_id + 'slider, ' + this.n_id + ', ' + this.n_step + ')"  onmouseup="return f_ReloadPage(' + this.n_id + ')"></td></tr></table>')
  70.     }
  71.     this.e_base   = get_element('sl' + this.n_id + 'base');
  72.     this.e_slider = get_element('sl' + this.n_id + 'slider');
  73.     
  74.     // safely hook document/window events
  75.     if (document.onmousemove != f_sliderMouseMove) {
  76.         window.f_savedMouseMove = document.onmousemove;
  77.         document.onmousemove = f_sliderMouseMove;
  78.     }
  79.     if (document.onmouseup != f_sliderMouseUp) {
  80.         window.f_savedMouseUp = document.onmouseup;
  81.         document.onmouseup = f_sliderMouseUp;
  82.     }
  83.     // preset to the value in the input box if available
  84.     var e_input = this.s_form == null
  85.         ? get_element(this.s_name)
  86.         : document.forms[this.s_form]
  87.             ? document.forms[this.s_form].elements[this.s_name]
  88.             : null;
  89.     this.f_setValue(e_input && e_input.value != '' ? e_input.value : null, 1);
  90.     this.e_slider.style.visibility = 'visible';
  91. }
  92.  
  93. function f_sliderMouseOut (n_id) {
  94.     if (window.n_activeSliderId == n_id)
  95.     {
  96.         window.n_activeSliderId = null;
  97.         var returnfield = document.getElementById("d11");
  98.         returnfield.style.visibility="hidden";
  99.         return f_ReloadPage(n_id);
  100.     }
  101.     return false;
  102. }
  103.  
  104. function f_sliderMouseDown (n_id) {
  105.     window.n_activeSliderId = n_id;
  106.     return false;
  107. }
  108.  
  109. function f_ReloadPage(n_id)
  110.             {
  111.                 // ValueField = window.status;
  112.                 if (window.status != "") {    
  113.                     CurrentValue = window.status; } //ValueField.value;
  114.                 else {
  115.                     ValueField = document.getElementById(A_SLIDERS[n_id].s_name);    
  116.                     CurrentValue = ValueField.value; }
  117.                 // alert(CurrentValue);
  118.                 window.location.href="pehp://" + CurrentValue;
  119.                 return false;
  120.             }
  121.  
  122. function f_sliderJumpStep(base, slider, n_id, step)
  123. {
  124.     ValueField = document.getElementById(A_SLIDERS[n_id].s_name);    
  125.     CurrentValue = ValueField.value;
  126.     b_vertical = (A_SLIDERS[n_id].b_vertical);
  127.     this.e_base   = base;
  128.     this.e_slider = slider;
  129.     if (b_vertical)
  130.     {
  131.         BaseTop = f_sliderGetPos (true, true)
  132.         MouseTop = window.n_mouseY;
  133.         A_SLIDERS[n_id].f_setValue(CurrentValue - 0 + step);
  134.     }else{
  135.         BaseLeft = f_sliderGetPos (false, true)
  136.         MouseLeft = window.n_mouseX;
  137.         A_SLIDERS[n_id].f_setValue(CurrentValue - 0 + step);
  138. }
  139.     return false;
  140. }
  141.  
  142. function f_sliderJumpTo(base, slider, n_id, NewValue)
  143. {
  144.     b_vertical = (A_SLIDERS[n_id].b_vertical);
  145.     this.e_base   = base;
  146.     this.e_slider = slider;
  147.     if (b_vertical)
  148.     {
  149.         BaseTop = f_sliderGetPos (true, true)
  150.         MouseTop = window.n_mouseY;
  151.         A_SLIDERS[n_id].f_setValue(NewValue);
  152.     }else{
  153.         BaseLeft = f_sliderGetPos (false, true)
  154.         MouseLeft = window.n_mouseX;
  155.         A_SLIDERS[n_id].f_setValue(NewValue);
  156. }
  157.     return false;
  158. }
  159.  
  160. function f_sliderJumpInterval(base, slider, n_id, interval)
  161. {
  162.     ValueField = document.getElementById(A_SLIDERS[n_id].s_name);    
  163.     CurrentValue = ValueField.value;
  164.     b_vertical = (A_SLIDERS[n_id].b_vertical);
  165.     this.e_base   = base;
  166.     this.e_slider = slider;
  167.     MinValue = A_SLIDERS[n_id].n_minValue;
  168.     if (b_vertical)
  169.     {
  170.         SliderRange = ((A_SLIDERS[n_id].n_sliderHeight-0+4)/A_SLIDERS[n_id].n_pix2value);
  171.         BaseTop = f_sliderGetPos (true, true)
  172.         MouseTop = window.n_mouseY;
  173.         MaxValue = A_SLIDERS[n_id].n_maxValue;
  174.         NewValue = (MouseTop - BaseTop)/A_SLIDERS[n_id].n_pix2value;
  175.         NewValue = MaxValue-NewValue;
  176. //        alert(MinValue);
  177. //        alert(MouseTop);
  178. //        alert(BaseTop);
  179. //        alert(A_SLIDERS[n_id].n_pix2value);
  180. //        alert(NewValue); 
  181. //        alert(SliderRange); 
  182. //        alert(CurrentValue);
  183.         if (NewValue < CurrentValue - SliderRange - MinValue)
  184.         {
  185.             A_SLIDERS[n_id].f_setValue(CurrentValue - interval);
  186.         }
  187.         else if (NewValue > CurrentValue)
  188.         {
  189.             A_SLIDERS[n_id].f_setValue(CurrentValue - 0 + interval);
  190.         }        
  191.     }else{
  192.         SliderRange = ((A_SLIDERS[n_id].n_sliderWidth-0+4)/A_SLIDERS[n_id].n_pix2value);
  193.         BaseLeft = f_sliderGetPos (false, true)
  194.         MouseLeft = window.n_mouseX;
  195.         NewValue = (MouseLeft - BaseLeft)/A_SLIDERS[n_id].n_pix2value;
  196.         if (NewValue < CurrentValue - MinValue)
  197.         {
  198.             A_SLIDERS[n_id].f_setValue(CurrentValue - interval);
  199.         }
  200.         else if (NewValue > (CurrentValue - MinValue - 0 + SliderRange))
  201.         {
  202.             A_SLIDERS[n_id].f_setValue(CurrentValue - 0 + interval);
  203.         }        
  204.     }
  205.     return false;
  206. }
  207.  
  208. function f_sliderSetValue (n_value, b_noInputCheck) {
  209.     if (n_value == null)
  210.         n_value = this.n_value == null ? this.n_minValue : this.n_value;
  211.     if (isNaN(n_value))
  212.         return false;
  213.     // round to closest multiple if step is specified
  214.     if (this.n_step)
  215.         n_value = Math.round((n_value - this.n_minValue) / this.n_step) * this.n_step + this.n_minValue;
  216.     // smooth out the result
  217.     if (n_value % 1)
  218.         n_value = Math.round(n_value * 1e5) / 1e5;
  219.  
  220.     if (n_value < this.n_minValue)
  221.         n_value = this.n_minValue;
  222.     if (n_value > this.n_maxValue)
  223.         n_value = this.n_maxValue;
  224.  
  225.     this.n_value = n_value;
  226.  
  227.     // move the slider
  228.     if (this.b_vertical)
  229.         this.e_slider.style.top  = (this.n_pathTop + this.n_pathLength - Math.round((n_value - this.n_minValue) * this.n_pix2value)) + 'px';
  230.     else
  231.         this.e_slider.style.left = (this.n_pathLeft + Math.round((n_value - this.n_minValue) * this.n_pix2value)) + 'px';
  232.  
  233.     // save new value
  234.     var e_input;
  235.     if (this.s_form == null) {
  236.         e_input = get_element(this.s_name);
  237.         if (!e_input)
  238.             return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the input with ID='" + this.s_name + "'.");
  239.     }
  240.     else {
  241.         var e_form = document.forms[this.s_form];
  242.         if (!e_form)
  243.             return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the form with NAME='" + this.s_form + "'.");
  244.         e_input = e_form.elements[this.s_name];
  245.         if (!e_input)
  246.             return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the input with NAME='" + this.s_name + "'.");
  247.     }
  248.     e_input.value = n_value;
  249. //    return f_popup(this.n_id)
  250. }
  251.  
  252. // get absolute position of 'this' element in the document
  253. function f_sliderGetPos (b_vertical, b_base) {
  254.     var n_pos = 0,
  255.         s_coord = (b_vertical ? 'Top' : 'Left');
  256.     var o_elem = o_elem2 = b_base ? this.e_base : this.e_slider;
  257.     
  258.     while (o_elem) {
  259.         n_pos += o_elem["offset" + s_coord];
  260.         o_elem = o_elem.offsetParent;
  261.     }
  262.     o_elem = o_elem2;
  263.  
  264.     var n_offset;
  265.     while (o_elem.tagName != "BODY") {
  266.         n_offset = o_elem["scroll" + s_coord];
  267.         if (n_offset)
  268.             n_pos -= o_elem["scroll" + s_coord];
  269.         o_elem = o_elem.parentNode;
  270.     }
  271.     return n_pos;
  272. }
  273.  
  274. function f_sliderMouseDown (n_id) {
  275.     window.n_activeSliderId = n_id;
  276.     return false;
  277. }
  278.  
  279. function f_sliderMouseUp (e_event, b_watching) {
  280.     if (window.n_activeSliderId != null) {
  281.         var o_slider = window.A_SLIDERS[window.n_activeSliderId];
  282.         o_slider.f_setValue(o_slider.n_minValue + (o_slider.b_vertical
  283.             ? (o_slider.n_pathLength - parseInt(o_slider.e_slider.style.top) + o_slider.n_pathTop)
  284.             : (parseInt(o_slider.e_slider.style.left) - o_slider.n_pathLeft)) / o_slider.n_pix2value);
  285.         if (b_watching)    return;
  286.         window.n_activeSliderId = null;
  287.         var returnfield = document.getElementById("d11");
  288.         returnfield.style.visibility="hidden";
  289.     }
  290.     if (window.f_savedMouseUp)
  291.         return window.f_savedMouseUp(e_event);
  292. }
  293.  
  294. function f_sliderMouseMove (e_event) {
  295.  
  296.     if (!e_event && window.event) e_event = window.event;
  297.  
  298.     // save mouse coordinates
  299.     if (e_event) {
  300.         window.n_mouseX = e_event.clientX + f_scrollLeft();
  301.         window.n_mouseY = e_event.clientY + f_scrollTop();
  302.     }
  303.  
  304.     // check if in drag mode
  305.     if (window.n_activeSliderId != null) {
  306.         var o_slider = window.A_SLIDERS[window.n_activeSliderId];
  307.  
  308.         var n_pxOffset;
  309.         if (o_slider.b_vertical) {
  310.             var n_sliderTop = window.n_mouseY - o_slider.n_sliderHeight / 2 - o_slider.f_getPos(1, 1) - 3;
  311.             // limit the slider movement
  312.             if (n_sliderTop < o_slider.n_pathTop)
  313.                 n_sliderTop = o_slider.n_pathTop;
  314.             var n_pxMax = o_slider.n_pathTop + o_slider.n_pathLength;
  315.             if (n_sliderTop > n_pxMax)
  316.                 n_sliderTop = n_pxMax;
  317.             o_slider.e_slider.style.top = n_sliderTop + 'px';
  318.             n_pxOffset = o_slider.n_pathLength - n_sliderTop + o_slider.n_pathTop;
  319.                 return f_popup(this.n_id)
  320.         }
  321.         else {
  322.             var n_sliderLeft = window.n_mouseX - o_slider.n_sliderWidth / 2 - o_slider.f_getPos(0, 1) - 3;
  323.             // limit the slider movement
  324.             if (n_sliderLeft < o_slider.n_pathLeft)
  325.                 n_sliderLeft = o_slider.n_pathLeft;
  326.             var n_pxMax = o_slider.n_pathLeft + o_slider.n_pathLength;
  327.             if (n_sliderLeft > n_pxMax)
  328.                 n_sliderLeft = n_pxMax;
  329.             o_slider.e_slider.style.left = n_sliderLeft + 'px';
  330.             n_pxOffset = n_sliderLeft - o_slider.n_pathLeft;
  331.                 f_popup(this.n_id)
  332.         }
  333.         if (o_slider.b_watch)
  334.              f_sliderMouseUp(e_event, 1);
  335.  
  336.         return false;
  337.     }
  338.     if (window.f_savedMouseMove)
  339.         return window.f_savedMouseMove(e_event);
  340. }
  341.  
  342. // get the scroller positions of the page
  343. function f_scrollLeft() {
  344.     return f_filterResults (
  345.         window.pageXOffset ? window.pageXOffset : 0,
  346.         document.documentElement ? document.documentElement.scrollLeft : 0,
  347.         document.body ? document.body.scrollLeft : 0
  348.     );
  349. }
  350. function f_scrollTop() {
  351.     return f_filterResults (
  352.         window.pageYOffset ? window.pageYOffset : 0,
  353.         document.documentElement ? document.documentElement.scrollTop : 0,
  354.         document.body ? document.body.scrollTop : 0
  355.     );
  356. }
  357. function f_filterResults(n_win, n_docel, n_body) {
  358.     var n_result = n_win ? n_win : 0;
  359.     if (n_docel && (!n_result || (n_result > n_docel)))
  360.         n_result = n_docel;
  361.     return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
  362. }
  363.  
  364. function f_sliderError (n_id, s_message) {
  365.     alert("Slider #" + n_id + " Error:\n" + s_message);
  366.     window.n_activeSliderId = null;
  367. }
  368.  
  369. get_element = document.all ?
  370.     function (s_id) { return document.all[s_id] } :
  371.     function (s_id) { return document.getElementById(s_id) };
  372.  
  373.